/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Diccionario_Interprete;

import java.util.ArrayList;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * Clase que analiza y traduce una SQL Query mediante un Dictionary y expresiones regulares..
 * @author Felipe Rachid - Javier Pérez
 */
public class Interpreter
{
    private ArrayList<String> dismantledQuery;
    private Dictionary myDictionary;
    
    /**********************************************************************/
    /**********************************************************************/
    /**********************************************************************/
    
    /**
     * @return dismantledQuery ArrayList que contiene las palabras traducibles.
     */
    private ArrayList<String> getDismantledQuery()
    { return dismantledQuery; }

    /**
     * @param dismantledQuery ArrayList que contiene las palabras traducibles.
     */
    private void setDismantledQuery(ArrayList<String> dismantledQuery)
    { this.dismantledQuery = dismantledQuery; }
    
     /**
     * @return myDictionary Diccionario de traducciones.
     */
    public Dictionary getMyDictionary()
    { return myDictionary; }

    /**
     * @param myDictionary Diccionario de traducciones.
     */
    public void setMyDictionary(Dictionary myDictionary)
    { this.myDictionary = myDictionary; }
    
    /**********************************************************************/
    /**********************************************************************/
    /**********************************************************************/
    
    /**
     * Constructor de la clase Interpreter que incializa 
     * un Dictionary para evitar exceso de parámetros y 
     * repetición de creación del mismo objeto.
     */
    public Interpreter()
    {  myDictionary = new Dictionary(); }
    
    /**
     * Analiza si contiene asteriscos una SQL Query.
     * @param userLanguage Nombre del lenguaje a traducir.
     * @param query String que contiene la SQL Query.
     * @return procesedQuery SQL Query pre-procesada.
     */
    private String asteroidAnalizer(String userLanguage, String query)
    {
        //Se compila patrón.
        Pattern patron = Pattern.compile("select[ ]*\\*[ ]*from|select[ ]*\\*[ ]*,|.\\*");
        //Se crea una marca para el Query.
        Matcher marca = patron.matcher(query);
        //Se busca coincidencias del patron generado.
        String procesedQuery = query;
        if(marca.find())
        { procesedQuery = procesedQuery.replaceFirst("\\*", getMyDictionary().obtainTranslate(userLanguage, "*")); }
        return procesedQuery;
    }
    
    /**
     * Captura las palabras traducibles y las almacena en un ArrayList.
     * @param userLanguage Nombre del lenguaje a traducir.
     * @param query String que contiene la SQL Query para ser analizada.
     * @return procesedQuery SQL Query pre-procesada.
     */
    private String analizer(String userLanguage, String query)
    {
        //Query que será pre-procesada en caso de contener asteriscos.
        String procesedQuery = query;
        if(query.contains("*")) procesedQuery = asteroidAnalizer(userLanguage, query);
        setDismantledQuery(new ArrayList<String>());
        //String que contiene los símbolos separadores de palabras.
        //Algunos los precede "\\" para que Regex no los capte como propios.
        String divider = "-/+\\(\\)., \\*;><=`";
        //Se compila patrón.
        Pattern patron = Pattern.compile("["+divider+"]+|[^"+divider+"]+");
        //Se crea una marca para el Query.
        Matcher marca = patron.matcher(procesedQuery);
        //Se busca coincidencias del patron generado.
        while(marca.find())
        {
            //Todas aquellas palabras entre separadores las captura.
            String word = procesedQuery.substring(marca.start(), marca.end());
            if(!(divider.contains(String.valueOf(word.charAt(0)))) && getMyDictionary().existDefinition(word)) 
            { getDismantledQuery().add(word); }
        }
        return procesedQuery;
    }
    
    /**
     * Analiza un SQL Query y lo traduce.
     * @param userLanguage Especificación del lenguaje al que se quiere traducir.
     * @param query SQL Query a traducir.
     * @return translatedQuery SQL Query traducida.
     */
    public String translator(String userLanguage, String query)
    {  
        //String que será devuelto como la traducción del original.
        String translatedQuery = analizer(userLanguage, query);
        int arrayLenght = this.getDismantledQuery().size();
        for (int i = 0; i < arrayLenght; i++ )
        {
            String wordToTranslate = getDismantledQuery().get(i);
            String wordTranslated = getMyDictionary().obtainTranslate(userLanguage, wordToTranslate);
            translatedQuery = translatedQuery.replaceFirst(wordToTranslate,wordTranslated);    
        }
        return translatedQuery; 
    }
}